package com.kong.service;

import com.github.benmanes.caffeine.cache.Cache;
import com.github.benmanes.caffeine.cache.Caffeine;
import org.burgeon.commons.unique.IDWorker;
import org.springframework.util.StringUtils;

import java.util.concurrent.TimeUnit;

public class GenerateContextHolder {

    private static Cache<String, GenerateContext> cache = Caffeine.newBuilder()
            .initialCapacity(3)
            .maximumSize(4)
            .expireAfterAccess(20, TimeUnit.MINUTES)
            .build();


    public static String putDatasourceId(String token, String datasourceId) {
        if (StringUtils.hasText(token)) {
            GenerateContext generateContext = cache.getIfPresent(token);
            if (generateContext == null) {
                return null;
            }
            generateContext.setDatasourceId(datasourceId);
            cache.put(token, generateContext);
            return token;
        } else {
            token = IDWorker.nextId();
            GenerateContext generateContext = new GenerateContext();
            generateContext.setDatasourceId(datasourceId);
            cache.put(token, generateContext);
            return token;
        }
    }

    public static String putJavaTemplateId(String token, String javaTemplateId) {
        if (StringUtils.hasText(token)) {
            GenerateContext generateContext = cache.getIfPresent(token);
            if (generateContext == null) {
                return null;
            }
            generateContext.setJavaTemplateId(javaTemplateId);
            cache.put(token, generateContext);
            return token;
        } else {
            token = IDWorker.nextId();
            GenerateContext generateContext = new GenerateContext();
            generateContext.setJavaTemplateId(javaTemplateId);
            cache.put(token, generateContext);
            return token;
        }
    }

    public static String putSelectedTables(String token, String selectedTables) {
        if (StringUtils.hasText(token)) {
            GenerateContext generateContext = cache.getIfPresent(token);
            if (generateContext == null) {
                return null;
            }
            generateContext.setSelectedTables(selectedTables);
            cache.put(token, generateContext);
            return token;
        } else {
            token = IDWorker.nextId();
            GenerateContext generateContext = new GenerateContext();
            generateContext.setSelectedTables(selectedTables);
            cache.put(token, generateContext);
            return token;
        }
    }


    public static String putGenerateConfigId(String token, String generateConfigId) {
        if (StringUtils.hasText(token)) {
            GenerateContext generateContext = cache.getIfPresent(token);
            if (generateContext == null) {
                return null;
            }
            generateContext.setGenerateConfigId(generateConfigId);
            cache.put(token, generateContext);
            return token;
        } else {
            token = IDWorker.nextId();
            GenerateContext generateContext = new GenerateContext();
            generateContext.setGenerateConfigId(generateConfigId);
            cache.put(token, generateContext);
            return token;
        }
    }

    public static GenerateContext getByToken(String token) {
        return cache.getIfPresent(token);
    }


}
